/**
 *
 * @description:应用（启动）入口文件
 * @author:junyong.hong
 * @createTime:2018/1/7
 * @version:1.0.0.0
 * @history:
 *    1、
 *    2、
 *
 */

// 加载express模块
var express = require('express');
// 加载模板处理模块
var swig = require('swig');

// 加载数据库模块
var mongoose = require('mongoose');

// 加载body-parser，用来处理post提交过来的数据
var bodyParser = require('body-parser');

// 加载cookies模块
var Cookies = require('cookies');

// 创建app应用 ==> NodeJs Http.createServer();
var app = express();

// 引入User模型
var User = require('./models/User');

/*====================================  设置静态文件托管 begin ====================================*/
// 当用户访问的url以/public开始，那么直接返回对应__dirname + '/public'下的文件
console.log('public = ' + __dirname);
app.use('/public',express.static( __dirname + '/public') );

/**
 *
 */
// app.get('/main.css',function (req,res,next) {
//    res.setHeader('content-type','text/css');
//    res.send('body{background:red;}')
// });
/*====================================  设置静态文件托管 end ====================================*/



/*====================================  配置应用模版 begin ====================================*/
// 定义当前应用所使用的模版引擎
// 第一个参数：模版引擎的名称，同时也是模版文件的后缀；第二个参数表示用于解析处理模版内容发方法
app.engine('html',swig.renderFile);
// 设置模版文件存放的目录，第一个参数必须是views，第二个参数是目录
app.set('views','./views');
// 注册所使用的模版引擎，第一个参数必须是view engine，第二个参数和app.engine这个方法中定义的模版引擎的名称（第一个参数）是一致的
app.set('view engine','html');
// 再开发过程中，需要取消模版缓存
swig.setDefaults({cache:false});
/*====================================  配置应用模版 end ====================================*/



/*====================================  bodyParser设置 begin ====================================*/
// 解析url的数据  这样就可以在req.body中获取到提交过来的数据
app.use(bodyParser.urlencoded({extended:true}));

/*====================================  bodyParser设置 end ====================================*/



/*====================================  cookies设置 begin ====================================*/
// 无论请求哪个地址，都会访问中间件（入口文件）
app.use(function (req,res,next) {
    req.cookies = new Cookies(req,res);
    // console.log(req.cookies.get('userInfo'));

    //解析登录用户的cookie信息
    req.userInfo = {};
    if(req.cookies.get('userInfo')){
        try{
            req.userInfo = JSON.parse(req.cookies.get('userInfo'));

            //获取当前登录用户的类型，是否是管理员
            User.findById(req.userInfo._id).then(function (userInfo) {
               req.userInfo.isAdmin = Boolean(userInfo.isAdmin);
               next();
            });
        }catch(e){
            next();
        }
    }else {
        next();
    }
});

/*====================================  cookies设置 end ====================================*/



/*====================================  划分模块 begin ====================================*/
app.use('/admin',require('./routers/admin.router'));
app.use('/api',require('./routers/api.router'));
app.use('/',require('./routers/main.router'));

/*====================================  划分模块 end ====================================*/

/**
 * 首页
 *  req：request对象
 *  res：response对象
 *  next：函数
 */
// app.get('/',function (req,res,next) {
//    // res.send('<h1>欢迎我的博客！</h1>');
//
//
//     /**
//      * 读取views目录下的指定文件，解析并返回给客户端
//      * 第一个参数：表示模版的文件，相对于views目录 views/index.html
//      * 第二个参数：传递给模版使用的数据
//      */
//     res.render('index');
// });




//连接数据库
mongoose.connect('mongodb://localhost:27017/nodejs-blog',function (err) {
    if(err){
       console.log('数据库连接失败');
    }else{
        console.log('数据库连接成功，端口为3304');

        // 监听http请求 也就是启动应用
        app.listen(3304);
    }
});



/**
 * 用户发送http请求 -> url -> 解析路由 -> 找到匹配的规则 -> 执行指定绑定函数，返回对应内容至用户  ->
 * /public -> 静态 -> 直接读取指定目录下的文件，返回给用户 -> 动态 -> 处理业务逻辑，加载模版，解析模版 -> 返回数据给用户
 *
 */
